{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "executionInfo": {
     "elapsed": 692,
     "status": "ok",
     "timestamp": 1649955038244,
     "user": {
      "displayName": "Sam Lu",
      "userId": "15789059763790170725"
     },
     "user_tz": -480
    },
    "id": "dB-atd8Y-vy7"
   },
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "from tqdm import tqdm\n",
    "import random\n",
    "import time\n",
    "\n",
    "\n",
    "class CliffWalkingEnv:\n",
    "    def __init__(self, ncol, nrow):\n",
    "        self.nrow = nrow\n",
    "        self.ncol = ncol\n",
    "        self.x = 0  # 记录当前智能体位置的横坐标\n",
    "        self.y = self.nrow - 1  # 记录当前智能体位置的纵坐标\n",
    "\n",
    "    def step(self, action):  # 外部调用这个函数来改变当前位置\n",
    "        # 4种动作, change[0]:上, change[1]:下, change[2]:左, change[3]:右。坐标系原点(0,0)\n",
    "        # 定义在左上角\n",
    "        change = [[0, -1], [0, 1], [-1, 0], [1, 0]]\n",
    "        self.x = min(self.ncol - 1, max(0, self.x + change[action][0]))\n",
    "        self.y = min(self.nrow - 1, max(0, self.y + change[action][1]))\n",
    "        next_state = self.y * self.ncol + self.x\n",
    "        reward = -1\n",
    "        done = False\n",
    "        if self.y == self.nrow - 1 and self.x > 0:  # 下一个位置在悬崖或者目标\n",
    "            done = True\n",
    "            if self.x != self.ncol - 1:\n",
    "                reward = -100\n",
    "        return next_state, reward, done\n",
    "\n",
    "    def reset(self):  # 回归初始状态,起点在左上角\n",
    "        self.x = 0\n",
    "        self.y = self.nrow - 1\n",
    "        return self.y * self.ncol + self.x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "executionInfo": {
     "elapsed": 9,
     "status": "ok",
     "timestamp": 1649955038245,
     "user": {
      "displayName": "Sam Lu",
      "userId": "15789059763790170725"
     },
     "user_tz": -480
    },
    "id": "VZx5sBiD-vy9"
   },
   "outputs": [],
   "source": [
    "class DynaQ:\n",
    "    \"\"\" Dyna-Q算法 \"\"\"\n",
    "    def __init__(self,\n",
    "                 ncol,\n",
    "                 nrow,\n",
    "                 epsilon,\n",
    "                 alpha,\n",
    "                 gamma,\n",
    "                 n_planning,\n",
    "                 n_action=4):\n",
    "        self.Q_table = np.zeros([nrow * ncol, n_action])  # 初始化Q(s,a)表格\n",
    "        self.n_action = n_action  # 动作个数\n",
    "        self.alpha = alpha  # 学习率\n",
    "        self.gamma = gamma  # 折扣因子\n",
    "        self.epsilon = epsilon  # epsilon-贪婪策略中的参数\n",
    "\n",
    "        self.n_planning = n_planning  #执行Q-planning的次数, 对应1次Q-learning\n",
    "        self.model = dict()  # 环境模型\n",
    "\n",
    "    def take_action(self, state):  # 选取下一步的操作\n",
    "        if np.random.random() < self.epsilon:\n",
    "            action = np.random.randint(self.n_action)\n",
    "        else:\n",
    "            action = np.argmax(self.Q_table[state])\n",
    "        return action\n",
    "\n",
    "    def q_learning(self, s0, a0, r, s1):\n",
    "        td_error = r + self.gamma * self.Q_table[s1].max(\n",
    "        ) - self.Q_table[s0, a0]\n",
    "        self.Q_table[s0, a0] += self.alpha * td_error\n",
    "\n",
    "    def update(self, s0, a0, r, s1):\n",
    "        self.q_learning(s0, a0, r, s1)\n",
    "        self.model[(s0, a0)] = r, s1  # 将数据添加到模型中\n",
    "        for _ in range(self.n_planning):  # Q-planning循环\n",
    "            # 随机选择曾经遇到过的状态动作对\n",
    "            (s, a), (r, s_) = random.choice(list(self.model.items()))\n",
    "            self.q_learning(s, a, r, s_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "executionInfo": {
     "elapsed": 10,
     "status": "ok",
     "timestamp": 1649955038246,
     "user": {
      "displayName": "Sam Lu",
      "userId": "15789059763790170725"
     },
     "user_tz": -480
    },
    "id": "NOMaPWZS-vy9"
   },
   "outputs": [],
   "source": [
    "def DynaQ_CliffWalking(n_planning):\n",
    "    ncol = 12\n",
    "    nrow = 4\n",
    "    env = CliffWalkingEnv(ncol, nrow)\n",
    "    epsilon = 0.01\n",
    "    alpha = 0.1\n",
    "    gamma = 0.9\n",
    "    agent = DynaQ(ncol, nrow, epsilon, alpha, gamma, n_planning)\n",
    "    num_episodes = 300  # 智能体在环境中运行多少条序列\n",
    "\n",
    "    return_list = []  # 记录每一条序列的回报\n",
    "    for i in range(10):  # 显示10个进度条\n",
    "        # tqdm的进度条功能\n",
    "        with tqdm(total=int(num_episodes / 10),\n",
    "                  desc='Iteration %d' % i) as pbar:\n",
    "            for i_episode in range(int(num_episodes / 10)):  # 每个进度条的序列数\n",
    "                episode_return = 0\n",
    "                state = env.reset()\n",
    "                done = False\n",
    "                while not done:\n",
    "                    action = agent.take_action(state)\n",
    "                    next_state, reward, done = env.step(action)\n",
    "                    episode_return += reward  # 这里回报的计算不进行折扣因子衰减\n",
    "                    agent.update(state, action, reward, next_state)\n",
    "                    state = next_state\n",
    "                return_list.append(episode_return)\n",
    "                if (i_episode + 1) % 10 == 0:  # 每10条序列打印一下这10条序列的平均回报\n",
    "                    pbar.set_postfix({\n",
    "                        'episode':\n",
    "                        '%d' % (num_episodes / 10 * i + i_episode + 1),\n",
    "                        'return':\n",
    "                        '%.3f' % np.mean(return_list[-10:])\n",
    "                    })\n",
    "                pbar.update(1)\n",
    "    return return_list"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 868
    },
    "executionInfo": {
     "elapsed": 4145,
     "status": "ok",
     "timestamp": 1649955042382,
     "user": {
      "displayName": "Sam Lu",
      "userId": "15789059763790170725"
     },
     "user_tz": -480
    },
    "id": "26Jk6HKF-vy-",
    "outputId": "5bfb06b4-aacd-4fe1-ab92-c0e216e56dc6"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Q-planning步数为：0\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Iteration 0: 100%|██████████| 30/30 [00:00<00:00, 480.86it/s, episode=30, return=-138.400]\n",
      "Iteration 1: 100%|██████████| 30/30 [00:00<00:00, 496.68it/s, episode=60, return=-64.100]\n",
      "Iteration 2: 100%|██████████| 30/30 [00:00<00:00, 562.26it/s, episode=90, return=-46.000]\n",
      "Iteration 3: 100%|██████████| 30/30 [00:00<00:00, 634.04it/s, episode=120, return=-38.000]\n",
      "Iteration 4: 100%|██████████| 30/30 [00:00<00:00, 706.77it/s, episode=150, return=-28.600]\n",
      "Iteration 5: 100%|██████████| 30/30 [00:00<00:00, 807.18it/s, episode=180, return=-25.300]\n",
      "Iteration 6: 100%|██████████| 30/30 [00:00<00:00, 922.50it/s, episode=210, return=-23.600]\n",
      "Iteration 7: 100%|██████████| 30/30 [00:00<00:00, 1277.43it/s, episode=240, return=-20.100]\n",
      "Iteration 8: 100%|██████████| 30/30 [00:00<00:00, 1162.46it/s, episode=270, return=-17.100]\n",
      "Iteration 9: 100%|██████████| 30/30 [00:00<00:00, 1133.41it/s, episode=300, return=-16.500]\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Q-planning步数为：2\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Iteration 0: 100%|██████████| 30/30 [00:00<00:00, 304.85it/s, episode=30, return=-53.800]\n",
      "Iteration 1: 100%|██████████| 30/30 [00:00<00:00, 273.10it/s, episode=60, return=-37.100]\n",
      "Iteration 2: 100%|██████████| 30/30 [00:00<00:00, 437.68it/s, episode=90, return=-23.600]\n",
      "Iteration 3: 100%|██████████| 30/30 [00:00<00:00, 471.68it/s, episode=120, return=-18.500]\n",
      "Iteration 4: 100%|██████████| 30/30 [00:00<00:00, 546.04it/s, episode=150, return=-16.400]\n",
      "Iteration 5: 100%|██████████| 30/30 [00:00<00:00, 1108.71it/s, episode=180, return=-16.400]\n",
      "Iteration 6: 100%|██████████| 30/30 [00:00<00:00, 1009.74it/s, episode=210, return=-13.400]\n",
      "Iteration 7: 100%|██████████| 30/30 [00:00<00:00, 835.83it/s, episode=240, return=-13.200]\n",
      "Iteration 8: 100%|██████████| 30/30 [00:00<00:00, 686.06it/s, episode=270, return=-13.200]\n",
      "Iteration 9: 100%|██████████| 30/30 [00:00<00:00, 897.04it/s, episode=300, return=-13.500]\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Q-planning步数为：20\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Iteration 0: 100%|██████████| 30/30 [00:00<00:00, 147.65it/s, episode=30, return=-18.500]\n",
      "Iteration 1: 100%|██████████| 30/30 [00:00<00:00, 257.65it/s, episode=60, return=-13.600]\n",
      "Iteration 2: 100%|██████████| 30/30 [00:00<00:00, 246.04it/s, episode=90, return=-13.000]\n",
      "Iteration 3: 100%|██████████| 30/30 [00:00<00:00, 216.28it/s, episode=120, return=-13.500]\n",
      "Iteration 4: 100%|██████████| 30/30 [00:00<00:00, 247.44it/s, episode=150, return=-13.500]\n",
      "Iteration 5: 100%|██████████| 30/30 [00:00<00:00, 236.72it/s, episode=180, return=-13.000]\n",
      "Iteration 6: 100%|██████████| 30/30 [00:00<00:00, 255.54it/s, episode=210, return=-22.000]\n",
      "Iteration 7: 100%|██████████| 30/30 [00:00<00:00, 259.58it/s, episode=240, return=-23.200]\n",
      "Iteration 8: 100%|██████████| 30/30 [00:00<00:00, 277.84it/s, episode=270, return=-13.000]\n",
      "Iteration 9: 100%|██████████| 30/30 [00:00<00:00, 172.05it/s, episode=300, return=-13.400]\n"
     ]
    },
    {
     "data": {
      "image/png": "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47LLLuP3v/89c+fO5YILLuCGG24oue4777yTu+++m/nz5/PKK69QV1dX7qXeYlTTiECU9qpWxOgpRakWSmkEvYGzzz4bgMMPP5wNGzawfv36nO0rVqzgzDPPZPXq1bS3t+fkIpx44onU1NRQU1PD9ttvz6effgrAiBEjGD9+PAATJkzgo48+Cr32Kaec4u/zhz/8AYBXX32Vxx9/HIDjjjuOAQMGFBw3cuRIli1bxmWXXcaJJ57Il7/85YJ9PvjgAxYsWMAxxxwDONrJjjvuWHLdkyZN4qqrruKcc87hlFNOYdiwYQXn7SpU04iAX1VWNQ1F6VaGDh3KJ59ka5OuWLGCoUPDa5PmRyLm/3/ZZZdx6aWX8u677/KLX/wiJ8u9pibbKM22bVKpVMnxfLz9Su0TxoABA3j77bc54ogjmD59Ov/yL/9SsI8xhnHjxjF//nzmz5/Pu+++y3PPPVd0nSLCtddeyy9/+UtaWlqYNGkS77//fuQ5dRQVGhGwOho9pY5wRdkiDjjgABYvXsyHH35Ie3s7jzzyCCeddFLovr/97W8B5xd+v3796NevX872pqYmX+A8+OCD3TtxYNKkSfzud78D4LnnnmPdunUF+3z++edkMhlOPfVUbrvtNt566y0AGhsb2bhxIwCjR49mzZo1vP7664BT2mXhwmwBjLB1L126lL333ptrrrmGAw44oFuFhpqnIhAleqpY+XRFUaITi8W46667OPbYY0mn01xwwQWMGxduJqutrWW//fYjmUzywAMPFGy/+eabOf300xkwYABHHXUUH374YbfO/bvf/S5nn302Dz30EIcccgg77LBDgTN65cqVnH/++WQyGQC+973vATBt2jQuuugi3xH++9//nssvv5ympiZSqRRXXnml/zqErfsnP/kJL7zwApZlMW7cOI4//vjuW6gxZqt+TJgwwXSW5Ws3mV2uedocdPusovtsbE2aXa552uxyzdNm9odrC7Z72xSlN7No0aJKTyESX/rSl8zf//73Sk8jh9bWVpNMJo0xxrz22mtm33337fJrdMe6w95zYI4pck9VTSMCnhKh0VOKohRj+fLlnHHGGWQyGRKJBPfdd1+lp9QtqNCIgB89VcJVodFTitJzvPjii5WeQgGjRo1i3rx53XqN3rBuFRoRiOQIL6Np/PSs8fz9oy+6fnKKoig9iAqNCERx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qjT6zJkzefHFFwE477zzOOKII/j+97+fc/yMGTN4/PHHaWpqYuXKlZx77rl897vfzdmnubmZqVOnsm7dOpLJJLfddhtTp07lo48+4vjjj+fQQw/ltddeY+jQocycOZO6urqi5dBffPFF7rzzTp5++mluvvlmli9fzrJly1i+fDlXXnmlr4X8x3/8B//zP//D4MGDGT58OBMmTODqq6/Omdejjz7KLbfcgm3b9OvXj1mzZnHTTTfR0tLCq6++ynXXXceUKVO47LLLWLBgAclkkptvvpmpU6cWXfemTZs444wzWLFiBel0mu985zuceeaZnXoPe0OexgXAbwP/jxCRecAG4EZjzCvAUGBFYJ8V7lgoIvIN4BvgpNx3BecctAtjdwyvtulha/SUonQZ+aXRP/30U1+g7LDDDnz66aehx82ePZsFCxZQX1/PAQccwIknnpjT06K2tpbHH3+cvn378vnnn3PwwQdz0kknAbB48WJ+85vfcN9993HGGWfw2GOPce655wLh5dDzef/993nhhRfYuHEjo0eP5pvf/Cbz58/nscce4+233yaZTLL//vszYcKEgmNvvfVWnn32WYYOHcr69etJJBLceuutzJkzh7vuuguA66+/nqOOOooHHniA9evXc+CBB3L00UcXXffHH3/MTjvtxB//+EfAqcfVWbpNaIjILGCHkE03GGNmuvvcAKSAh91tq4GdjTFrRWQC8ISIjOvotY0x9wL3glNGZEvmn8/lk8uXGlafhrI1UUoj6G7KlUZ36sGFf9eOOeYYBg4cCDglzF999dUcoWGM4frrr+fll1/GsixWrlzpC6ARI0b4fTCCZc+9c4WNBznxxBOpqamhpqaG7bffnk8//ZS//e1vTJ06ldraWmpra/nKV74SeuykSZOYNm0aZ5xxRtHqvs899xxPPvkkd955JwCtra0sX7686LpPOOEE/v3f/51rrrmGKVOmcNhhh4WetyN0m9AwxhxdaruITAOmAJONWwDLGNMGtLnP54rIUmAPYCUwLHD4MHesV2FZGj2lKJ2lWGn0IUOGsHr1anbccUdWr17N9ttvH3p8uZLpDz/8MGvWrGHu3LnE43F23XVXv2x6fsn0lpYW//8o5dCLlVyPwvTp03nzzTf54x//yIQJE5g7d27BPsYYHnvssYKKvm+++WbouvfYYw/eeustnnnmGW688UYmT57MTTfdFHlOYVQqeuo44NvAScaYzYHxwSJiu89H4ji8lxljVgMbRORgN2rq68DMkFNXFFs1DUXpFKVKo5900kk8+OCDADz44INMnTo19BzPP/88X3zxBS0tLTzxxBNMmjQpZ3tTUxPbb7898XicF154gY8//rh7FuMyadIkv59Hc3MzTz/9dOh+S5cu5aCDDuLWW29l8ODBfPLJJzkl0wGOPfZY/vu//xuv0Oy8efP8bWHrXrVqFfX19Zx77rl861vf4q233ur0eirl07gLqAGed6XjG26k1OHArSKSBDLARcaYL9xjLgZmAHU4DvAec4JHJWaXj7BSFKU4Xmn0vffe2zcT/ed//icnnHAC1157LWeccQb3338/u+yyi9+7Ip8DDzyQU089lRUrVnDuuecW9Og+55xz+MpXvsLee+/NxIkTGTNmTLeu6YADDuCkk05in332YciQIey9994FJdMBvvWtb7F48WKMMUyePJl9992XnXfemTvuuIPx48dz3XXX8Z3vfIcrr7ySffbZh0wmw4gRI3whFLbuZ599lm9961tYlkU8HufnP/95p9ejpdG7kL++/yltyQzH771jj1xPUbqaaimNXowZM2bkOI57C83NzTQ0NLB582YOP/xw7r33Xvbff/8uO39n1q2l0SvIUWOGVHoKiqL0Qr7xjW+waNEiWltbOe+887pUYPQ0qmkoiuJT7ZqG0nE6qmloqI+iKOIr2A4AAAcpSURBVDls7T8klSxb8l6r0FAUxae2tpa1a9eq4NgGMMawdu3agt7q5VCfhqIoPsOGDWPFihWsWbOm0lNReoDa2lqGDRtWfscAKjQURfGJx+OMGDGi0tNQejFqnlIURVEio0JDURRFiYwKDUVRFCUyW32ehoisAba0uMwg4PMunE4l0bX0PraWdYCupbeypWvZxRgzOGzDVi80OoOIzCmW4FJt6Fp6H1vLOkDX0lvpjrWoeUpRFEWJjAoNRVEUJTIqNEpzb6Un0IXoWnofW8s6QNfSW+nytahPQ1EURYmMahqKoihKZFRoKIqiKJFRoRGCiBwnIh+IyBIRubbS8+koIvKRiLwrIvNFZI47tp2IPC8ii92/Ayo9zzBE5AER+UxEFgTGQucuDj9z36d3RKRXdbYpspabRWSl+97MF5ETAtuuc9fygYgcW5lZhyMiw0XkBRFZJCIL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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "np.random.seed(0)\n",
    "random.seed(0)\n",
    "n_planning_list = [0, 2, 20]\n",
    "for n_planning in n_planning_list:\n",
    "    print('Q-planning步数为：%d' % n_planning)\n",
    "    time.sleep(0.5)\n",
    "    return_list = DynaQ_CliffWalking(n_planning)\n",
    "    episodes_list = list(range(len(return_list)))\n",
    "    plt.plot(episodes_list,\n",
    "             return_list,\n",
    "             label=str(n_planning) + ' planning steps')\n",
    "plt.legend()\n",
    "plt.xlabel('Episodes')\n",
    "plt.ylabel('Returns')\n",
    "plt.title('Dyna-Q on {}'.format('Cliff Walking'))\n",
    "plt.show()\n",
    "\n",
    "# Q-planning步数为：0\n",
    "\n",
    "# Iteration 0: 100%|██████████| 30/30 [00:00<00:00, 615.42it/s, episode=30,\n",
    "# return=-138.400]\n",
    "# Iteration 1: 100%|██████████| 30/30 [00:00<00:00, 1079.50it/s, episode=60,\n",
    "# return=-64.100]\n",
    "# Iteration 2: 100%|██████████| 30/30 [00:00<00:00, 1303.35it/s, episode=90,\n",
    "# return=-46.000]\n",
    "# Iteration 3: 100%|██████████| 30/30 [00:00<00:00, 1169.51it/s, episode=120,\n",
    "# return=-38.000]\n",
    "# Iteration 4: 100%|██████████| 30/30 [00:00<00:00, 1806.96it/s, episode=150,\n",
    "# return=-28.600]\n",
    "# Iteration 5: 100%|██████████| 30/30 [00:00<00:00, 2303.21it/s, episode=180,\n",
    "# return=-25.300]\n",
    "# Iteration 6: 100%|██████████| 30/30 [00:00<00:00, 2473.64it/s, episode=210,\n",
    "# return=-23.600]\n",
    "# Iteration 7: 100%|██████████| 30/30 [00:00<00:00, 2344.37it/s, episode=240,\n",
    "# return=-20.100]\n",
    "# Iteration 8: 100%|██████████| 30/30 [00:00<00:00, 1735.84it/s, episode=270,\n",
    "# return=-17.100]\n",
    "# Iteration 9: 100%|██████████| 30/30 [00:00<00:00, 2827.94it/s, episode=300,\n",
    "# return=-16.500]\n",
    "\n",
    "# Q-planning步数为：2\n",
    "\n",
    "# Iteration 0: 100%|██████████| 30/30 [00:00<00:00, 425.09it/s, episode=30,\n",
    "# return=-53.800]\n",
    "# Iteration 1: 100%|██████████| 30/30 [00:00<00:00, 655.71it/s, episode=60,\n",
    "# return=-37.100]\n",
    "# Iteration 2: 100%|██████████| 30/30 [00:00<00:00, 799.69it/s, episode=90,\n",
    "# return=-23.600]\n",
    "# Iteration 3: 100%|██████████| 30/30 [00:00<00:00, 915.34it/s, episode=120,\n",
    "# return=-18.500]\n",
    "# Iteration 4: 100%|██████████| 30/30 [00:00<00:00, 1120.39it/s, episode=150,\n",
    "# return=-16.400]\n",
    "# Iteration 5: 100%|██████████| 30/30 [00:00<00:00, 1437.24it/s, episode=180,\n",
    "# return=-16.400]\n",
    "# Iteration 6: 100%|██████████| 30/30 [00:00<00:00, 1366.79it/s, episode=210,\n",
    "# return=-13.400]\n",
    "# Iteration 7: 100%|██████████| 30/30 [00:00<00:00, 1457.62it/s, episode=240,\n",
    "# return=-13.200]\n",
    "# Iteration 8: 100%|██████████| 30/30 [00:00<00:00, 1743.68it/s, episode=270,\n",
    "# return=-13.200]\n",
    "# Iteration 9: 100%|██████████| 30/30 [00:00<00:00, 1699.59it/s, episode=300,\n",
    "# return=-13.500]\n",
    "\n",
    "# Q-planning步数为：20\n",
    "\n",
    "# Iteration 0: 100%|██████████| 30/30 [00:00<00:00, 143.91it/s, episode=30,\n",
    "# return=-18.500]\n",
    "# Iteration 1: 100%|██████████| 30/30 [00:00<00:00, 268.53it/s, episode=60,\n",
    "# return=-13.600]\n",
    "# Iteration 2: 100%|██████████| 30/30 [00:00<00:00, 274.53it/s, episode=90,\n",
    "# return=-13.000]\n",
    "# Iteration 3: 100%|██████████| 30/30 [00:00<00:00, 264.25it/s, episode=120,\n",
    "# return=-13.500]\n",
    "# Iteration 4: 100%|██████████| 30/30 [00:00<00:00, 263.58it/s, episode=150,\n",
    "# return=-13.500]\n",
    "# Iteration 5: 100%|██████████| 30/30 [00:00<00:00, 245.27it/s, episode=180,\n",
    "# return=-13.000]\n",
    "# Iteration 6: 100%|██████████| 30/30 [00:00<00:00, 257.16it/s, episode=210,\n",
    "# return=-22.000]\n",
    "# Iteration 7: 100%|██████████| 30/30 [00:00<00:00, 257.08it/s, episode=240,\n",
    "# return=-23.200]\n",
    "# Iteration 8: 100%|██████████| 30/30 [00:00<00:00, 261.12it/s, episode=270,\n",
    "# return=-13.000]\n",
    "# Iteration 9: 100%|██████████| 30/30 [00:00<00:00, 213.01it/s, episode=300,\n",
    "# return=-13.400]"
   ]
  }
 ],
 "metadata": {
  "colab": {
   "collapsed_sections": [],
   "name": "第6章-Dyna-Q算法.ipynb",
   "provenance": []
  },
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
